package com.hzsai.handler;

import com.hzsai.utils.LineToHumpUtils;

import java.sql.ResultSetMetaData;
import java.lang.reflect.Field;
import java.sql.ResultSet;

/**
 * @Description 将结果集转换成bean对象的处理器
 * @Author suzhenyin
 * @Date 2019/4/23 9:46
 * @Version 1.0
 **/

public class BeanHandler implements ResultSetHandler {
    private Class<?> clazz;

    public BeanHandler(Class<?> clazz) {
        this.clazz = clazz;
    }

    // new BeanHandler(Bean.class)

    @Override
    public Object handler(ResultSet rs) {
        try {
            if (!rs.next()) { // 没有结果，直接不进行反射
                return null;
            }
            Object bean = clazz.newInstance();
            //得到结果集元数据
            ResultSetMetaData metadata = rs.getMetaData(); // 获取rs的原始数据
            //得到结果集中有几列数据
            int columnCount = metadata.getColumnCount(); // 列数，每一列就是一个属性
            for (int i = 0; i < columnCount; i++) {
                //得到每列的列名
                String coulmnName = metadata.getColumnName(i + 1);
                String newCoulmnName = LineToHumpUtils.lineToHump(coulmnName); // 数据的名字
                Object coulmnData = rs.getObject(i + 1); //数据的值
                //反射出类上列名对应的属性
                Field f = clazz.getDeclaredField(newCoulmnName); // 用数据的名字来反射书类上面的属性
                f.setAccessible(true);
                f.set(bean, coulmnData); // field设置值
            }
            return bean;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
